#include "../include/inherit_socket.h"
#include "../include/crc32.h"
#include "../include/my_log.h"
#include "../include/macro.h"
#include "../include/socket.h"
#include <ctime>
#include "logic_include/logic_macro.h"    // 业务处理类型
//把一些逻辑处理的宏
inherit_socket::inherit_socket():_socket(){

    this->init_handler_map();   //将目前的业务处理函数放到map里
}


//包已过时,直接return ,调用者线程会delete该条数据
void inherit_socket::thread_for_deal_message(char *message)
{
    //先进行数据校验-----判断客户端是否已经下线  crc校验数据的合法性，然后根据type去调用对应业务处理函数
    
    message_head_d * msg_head=(message_head_d *)message;    //消息头
    //到这里的数据不要去做拦截，可能由于应用层处理不过来，导致当成废包给处理了---------

    // if(msg_head->con_p->icurrentsequence!=msg_head->iCurrSequence){ //就算采用了延迟回收，数据依旧还没处理，如果连接被复用了，那么我这里的iCurrSequence是有可能发错包的
    //     //解决方案，不管是到来连接，连接释放，这个值都++，&=16383，将这个值整成int类型的原子变量---这种情况下发生错包的概率极其低，低到完全可以忽略
    //     delete[] message;
    //     return;
    // }

    //发送过来的包可能并没有包体
    package_head_d * pkg_head=(package_head_d *)(message+sizeof(message_head_d));   // 包头
    unsigned short body_len=ntohs(pkg_head->pkg_body_len);

    int body_crc32=ntohl(pkg_head->crc32);
    char * body_data;   //包体数据
    if(body_len==0){
        if(body_crc32!=0){
            //到这里，这个包，铁定有问题
            my_log::get_log_instance()->write_log(LOG_ALERT,0,"没有数据 crc32却有值 ！！！！");
            delete[] message;
            return ;
        }
        body_data=nullptr;
    }else{
        //有包体的，判断crc的合法性
        body_data=(message+sizeof(message_head_d)+sizeof(package_head_d));
        int get_crc32=CCRC32::GetInstance()->Get_CRC((unsigned char *)body_data,body_len);
        if(get_crc32!=body_crc32){
            //校验失败，数据在传输过程出错了
            my_log::get_log_instance()->write_log(LOG_ALERT,0,"crc32 校验失败！！！！");
            delete[] message;
            return;
        }
    
    }
    unsigned short pkg_type=ntohs(pkg_head->pkg_type);
    auto it=this->handler_map.find(pkg_type);
    //消息应该由各自的业务处理函数delete掉，到这里处理的数据不做delete处理
    if(it!=this->handler_map.end()){
        //表示存在该业务处理函数---对于每种存在的业务处理函数，如果有踢人机制，那么还得更新last_ping????

        (this->*((*it).second))(msg_head->con_p,message,body_data,body_len);        
    }else{
        my_log::get_log_instance()->write_log(LOG_ALERT,0,"居然没有对应的处理函数！！！！");   
    }

    
    return ;    //处理完
}

void inherit_socket::add_function_to_handlerMap(int type, handler handler_ptr)
{
    
    this->handler_map.insert(std::make_pair(type,handler_ptr));
}

void inherit_socket::init_handler_map()
{
    //初始化全部的业务处理函数
    this->add_function_to_handlerMap(PING,&inherit_socket::pong);   //处理心跳包
    this->add_function_to_handlerMap(FILE_UPLOAD,&inherit_socket::file_upload); //处理文件上传
    this->add_function_to_handlerMap(FILE_JUDGE_IS_CONTINUE_TO_UPLOAD,&inherit_socket::file_judge_is_continue_to_upload);
    this->add_function_to_handlerMap(FILE_JUDGE_IS_CONTINUE_TO_DOWNLOAD,&inherit_socket::file_judge_is_continue_to_download);
    this->add_function_to_handlerMap(RESPONSE_OF_DOWNLOAD_SPY,&inherit_socket::response_of_is_continue_to_download);
}

bool inherit_socket::pong(connection_p con_p,char * original_msg, char *body, unsigned short body_len)
{
    //处理心跳包
    //更改客户端连接结构体里的ping_last
    time_t now=time(NULL);
    con_p->last_ping=now;
    return true;
}